Avastage täiustatud elliptilise kõvera krüptograafia (ECC) toiminguid nagu ECDH, avaliku võtme taastamine ja Schnorri signatuurid, kasutades JavaScripti BigInti suurema turvalisuse ja jõudluse jaoks.
JavaScript BigInt Elliptiline kõverkrüptograafia: süvauuring täiustatud toimingutesse
Ajastul, kus domineerib digitaalne suhtlus, alates detsentraliseeritud rahandusest (DeFi) kuni täielikult krüpteeritud sõnumivahetuseni, pole meie krüptograafiliste aluste tugevus kunagi olnud kriitilisem. Elliptiline kõverkrüptograafia (ECC) on kaasaegse avaliku võtmega krüptograafia sammas, pakkudes tugevat turvalisust väiksemate võtmesuurustega võrreldes oma eelkäijatega nagu RSA. Aastaid oli nende keerukate matemaatiliste operatsioonide otse JavaScriptis sooritamine väljakutse, mis nõudis sageli spetsiaalseid teeke, mis abstraheerisid madala taseme üksikasjad või tegelesid JavaScripti standardse numbritüübi piirangutega.
Natiivse BigInt tüübi kasutuselevõtt JavaScriptis (ES2020) oli revolutsiooniline hetk. See vabastas arendajad 64-bitise ujukoma Number tüübi piirangutest, pakkudes mehhanismi suvaliselt suurte täisarvude käsitlemiseks. See üks funktsioon avas potentsiaali suure jõudlusega, natiivsete ja läbipaistvamate krüptograafiliste juurutuste jaoks otse JavaScripti keskkondades, nagu brauserid ja Node.js.
Kuigi paljud arendajad on kursis ECC põhitõdedega – võtmepaaride genereerimine ja sõnumite allkirjastamine –, peitub selle tehnoloogia tõeline jõud selle täiustatud toimingutes. See artikkel liigub põhitõdedest kaugemale, et uurida keerukaid krüptograafilisi protokolle ja tehnikaid, mis on nüüd tänu BigInt-ile kättesaadavad. Me süveneme Elliptilise kõvera Diffie-Hellmani (ECDH) turvalise võtmevahetuse, signatuuridest avaliku võtme taastamise ja võimsa, agregeerimist toetava Schnorri signatuuridesse.
BigInti revolutsioon JavaScripti krĂĽptograafias
Enne täiustatud toimingutesse sukeldumist on oluline mõista, miks BigInt on JavaScripti krüptograafia jaoks nii suur muutus.
Probleem tĂĽĂĽbiga `Number`
JavaScripti traditsiooniline Number tüüp on IEEE 754 topelttäpsusega 64-bitine ujukomaarv. See vorming on suurepärane paljude rakenduste jaoks, kuid sellel on krüptograafia jaoks kriitiline piirang: see suudab ohutult esitada täisarve kuni Number.MAX_SAFE_INTEGER, mis on 253 - 1.
Krüptograafilised võtmed ja ECC vahepealsed väärtused on oluliselt suuremad. Näiteks populaarne secp256k1 kõver, mida kasutavad Bitcoin ja Ethereum, toimib algarvude väljal, mis on 256 bitti pikad. Need arvud on suurusjärkude võrra suuremad kui see, mida standardne Number tüüp suudab täpsust kaotamata käsitleda. Selliste arvudega arvutuste tegemine tooks kaasa valed ja ebaturvalised tulemused.
Sisene `BigInt`: suvalise täpsusega täisarvud
BigInt lahendab selle probleemi elegantselt. See on eraldiseisev arvuline tüüp, mis pakub võimalust esitada mis tahes suurusega täisarve. Saate luua BigInt, lisades täisarvu literaali lõppu `n` või kutsudes välja konstruktori BigInt().
Näide:
const aLargeNumber = 9007199254740991n; // Ohutu BigIntiga
const anEvenLargerNumber = 115792089237316195423570985008687907853269984665640564039457584007908834671663n; // 256-bitine algarv
BigInt-iga töötavad kõik standardsed aritmeetilised operaatorid (+, -, *, /, %, **) nendel massiivsetel täisarvudel ootuspäraselt. See võime on aluskivi, millele on ehitatud natiivsed JavaScripti ECC juurutused, võimaldades krüptograafiliste algoritmide otsest, täpset ja turvalist arvutamist ilma väliste WebAssembly moodulite või kohmakate mitmeosaliste arvude teekide kasutamiseta.
Elliptilise kõvera krüptograafia põhitõdede kordamine
Täiustatud toimingute hindamiseks vaatame lühidalt üle ECC põhikontseptsioonid.
Oma olemuselt põhineb ECC elliptiliste kõverate algebralistel struktuuridel lõplikel väljadel. Need kõverad on määratletud Weierstrassi võrrandiga:
y2 = x3 + ax + b (mod p)
Kus `a` ja `b` on konstandid, mis määratlevad kõvera kuju, ja `p` on suur algarv, mis määratleb lõpliku välja.
Põhimõisted
- Punkt kõveral: Koordinaatide paar (x, y), mis rahuldab kõvera võrrandit. Kõik meie krüptograafilised toimingud on sisuliselt "punktaritmeetika".
- Baaspunkt (G): Avalikult teadaolev, standardiseeritud lähtepunkt kõveral.
- Privaatvõti (d): Väga suur, krüptograafiliselt turvaline juhuslik täisarv. See on teie saladus.
BigIntkontekstis on `d` suur `BigInt`. - Avalik võti (Q): Punkt kõveral, mis on tuletatud privaatvõtmest ja baaspunktist operatsiooni kaudu, mida nimetatakse skalaarkorrutamiseks: Q = d * G. See tähendab punkti G liitmist iseendaga `d` korda.
ECC turvalisus sõltub Elliptilise kõvera diskreetse logaritmi probleemist (ECDLP). Avaliku võtme `Q` arvutamine on lihtne, kui on antud privaatvõti `d` ja baaspunkt `G`. Kuid privaatvõtme `d` määramine on arvutuslikult võimatu, kui on antud ainult avalik võti `Q` ja baaspunkt `G`.
Täiustatud toiming 1: Elliptilise kõvera Diffie-Hellmani (ECDH) võtmevahetus
Üks ECC võimsamaid rakendusi on kahe osapoole vahelise jagatud saladuse loomine ebaturvalise sidekanali kaudu. Seda saavutatakse elliptilise kõvera Diffie-Hellmani (ECDH) võtmevahetusprotokolliga.
Eesmärk
Kujutage ette kahte inimest, Alicet ja Bobi, kes soovivad turvaliselt suhelda. Nad peavad kokku leppima sümmeetrilises krüpteerimisvõtmes, mida ainult nemad teavad, kuid nende ainus suhtlusvahend on avalik kanal, mida pealtkuulaja, Eve, saab jälgida. ECDH võimaldab neil arvutada identse jagatud saladuse, ilma et nad seda kunagi otse edastaksid.
Protokoll samm-sammult
- Võtme genereerimine:
- Alice genereerib oma privaatvõtme, `d_A` (suur juhuslik
BigInt), ja vastava avaliku võtme, `Q_A = d_A * G`. - Bob genereerib oma privaatvõtme, `d_B` (teine suur juhuslik
BigInt), ja oma avaliku võtme, `Q_B = d_B * G`.
- Alice genereerib oma privaatvõtme, `d_A` (suur juhuslik
- Avaliku võtme vahetus:
- Alice saadab oma avaliku võtme, `Q_A`, Bobile.
- Bob saadab oma avaliku võtme, `Q_B`, Alice'ile.
- Eve, pealtkuulaja, näeb nii `Q_A` kui ka `Q_B`, kuid ei saa ECDLP tõttu tuletada privaatvõtmeid `d_A` või `d_B`.
- Jagatud saladuse arvutamine:
- Alice võtab Bobi avaliku võtme `Q_B` ja korrutab selle oma privaatvõtmega `d_A`, et saada punkt S: S = d_A * Q_B.
- Bob võtab Alice'i avaliku võtme `Q_A` ja korrutab selle oma privaatvõtmega `d_B`, et saada punkt S: S = d_B * Q_A.
Kommutatiivsuse võlu
Nii Alice kui ka Bob jõuavad kõveral täpselt sama salajase punktini `S`. Seda seetõttu, et skalaarkorrutamine on assotsiatiivne ja kommutatiivne:
Alice'i arvutus: S = d_A * Q_B = d_A * (d_B * G)
Bobi arvutus: S = d_B * Q_A = d_B * (d_A * G)
Kuna d_A * d_B * G = d_B * d_A * G, arvutavad nad mõlemad sama tulemuse, ilma et nad kunagi oma privaatvõtmeid avaldaksid.
Jagatud punktist sümmeetrilise võtmeni
Saadud jagatud saladus `S` on punkt kõveral, mitte sümmeetriline võti, mis sobib krüpteerimisalgoritmidele nagu AES. Võtme tuletamiseks on standardne praktika võtta punkti `S` x-koordinaat ja läbida see Võtme tuletamise funktsioonist (KDF), nagu HKDF (HMAC-põhine võtme tuletamise funktsioon). KDF võtab jagatud saladuse ja soovi korral soola ja muu info ning loob soovitud pikkusega krüptograafiliselt tugeva võtme.
Kõik aluseks olevad arvutused – privaatvõtmete genereerimine juhuslike BigInt-idena ja skalaarkorrutamine – sõltuvad suuresti `BigInt` aritmeetikast.
Täiustatud toiming 2: Avaliku võtme taastamine signatuuridest
Paljudes süsteemides, eriti plokiahelates, on efektiivsus ja andmete minimeerimine ülimalt olulised. Tavaliselt vajate signatuuri kinnitamiseks sõnumit, signatuuri ennast ja allkirjastaja avalikku võtit. Kuid elliptilise kõvera digitaalse signatuuri algoritmi (ECDSA) nutikas omadus võimaldab teil avaliku võtme otse sõnumist ja signatuurist taastada. See tähendab, et avalikku võtit ei pea edastama, säästes väärtuslikku ruumi.
Kuidas see töötab (kõrgel tasemel)
ECDSA signatuur koosneb kahest komponendist, (`r`, `s`).
- `r` on tuletatud juhusliku punkti `k * G` x-koordinaadist.
- `s` arvutatakse sõnumi räsi (`z`), privaatvõtme (`d`) ja `r` alusel. Valem on: `s = k_inverse * (z + r * d) mod n`, kus `n` on kõvera järk.
Signatuuri kinnitamise võrrandi algebralise manipuleerimise abil on võimalik tuletada avaliku võtme `Q` avaldis. Kuid see protsess annab kaks võimalikku kehtivat avalikku võtit. Selle ebaselguse lahendamiseks lisatakse signatuurile väike lisateave, mida nimetatakse taaste ID-ks (sageli tähistatakse kui `v` või `recid`). See ID, tavaliselt 0, 1, 2 või 3, määrab, milline võimalikest lahendustest on õige ja kas võtme y-koordinaat on paaris või paaritu.
Miks `BigInt` on oluline
Avaliku võtme taastamiseks vajalikud matemaatilised toimingud on intensiivsed ja hõlmavad moodulipöördväärtusi, 256-bitiste arvude korrutamist ja liitmist. Näiteks hõlmab peamine samm `(r_inverse * (s*k - z)) * G` arvutamist. Need toimingud on täpselt need, mille jaoks `BigInt` on loodud. Ilma selleta oleks nende arvutuste tegemine natiivses JavaScriptis võimatu ilma olulise täpsuse ja turvalisuse kadumiseta.
Praktiline rakendus: Ethereumi tehingud
Seda tehnikat kasutatakse kuulsalt Ethereumis. Allkirjastatud tehing ei sisalda saatja avalikku aadressi otse. Selle asemel taastatakse aadress (mis on tuletatud avalikust võtmest) signatuuri komponentidest `v`, `r` ja `s`. See disainivalik säästab iga tehingu kohta 20 baiti, mis on globaalse plokiahela skaalal märkimisväärne kokkuhoid.
Täiustatud toiming 3: Schnorri signatuurid ja agregeerimine
Kuigi ECDSA on laialdaselt kasutusel, on sellel teatud puudusi, sealhulgas signatuuri plastilisus ja agregeerimisomaduste puudumine. Schnorri signatuurid, teine ECC-põhine skeem, pakuvad nendele probleemidele elegantseid lahendusi ja paljude krüptograafide arvates on need paremad.
Schnorri signatuuride peamised eelised
- Tõestatav turvalisus: Neil on ECDSA-ga võrreldes otsekohesem ja jõulisem turvatõestus.
- Mitte-plastilisus: Kolmandal osapoolel ei ole võimalik muuta kehtivat signatuuri teiseks kehtivaks signatuuriks sama sõnumi ja võtme jaoks.
- Lineaarsus (supervõime): See on kõige olulisem eelis. Schnorri signatuurid on lineaarsed, mis võimaldab võimsaid agregeerimistehnikaid.
Signatuuri agregeerimine selgitatud
Lineaarsuse omadus tähendab, et mitu signatuuri mitmelt allkirjastajalt saab kombineerida üheks, kompaktseks signatuuriks. See on suur muutus mitme signatuuriga (multisig) skeemide jaoks.
Kujutage ette stsenaariumi, kus tehing nõuab signatuure 3 osalejalt 5-st. ECDSA-ga peaksite lisama kõik kolm individuaalset signatuuri plokiahelasse, võttes oluliselt ruumi.
Schnorri signatuuridega on protsess palju tõhusam:
- Võtme agregeerimine: 3 osalejat saavad kombineerida oma individuaalsed avalikud võtmed (`Q1`, `Q2`, `Q3`), et luua üks agregaatne avalik võti (`Q_agg`).
- Signatuuri agregeerimine: Koostööprotokolli, nagu MuSig2, kaudu saavad osalejad luua ühe agregaatse signatuuri (`S_agg`), mis kehtib agregaatse avaliku võtme `Q_agg` jaoks.
Tulemuseks on tehing, mis näeb väljastpoolt välja identne tavalise ühe allkirjastajaga tehinguga. Sellel on üks avalik võti ja üks signatuur. See parandab dramaatiliselt tõhusust, skaleeritavust ja privaatsust, kuna keerukad multisig seadistused muutuvad lihtsatest eristamatuks.
`BigInt` roll
Agregeerimise võlu juured on lihtsas elliptilise kõvera punkti liitmises ja skalaararitmeetikas. Agregaatvõtme loomine hõlmab `Q_agg = Q1 + Q2 + Q3` ja agregaatse signatuuri loomine hõlmab individuaalsete signatuurikomponentide lisamist kõvera järgu mooduliga. Kõik need toimingud – mis moodustavad selliste protokollide aluse nagu MuSig2 – tehakse suurte täisarvude ja kõvera koordinaatidega, muutes `BigInt` asendamatuks tööriistaks Schnorri signatuuride ja agregeerimisskeemide juurutamisel JavaScriptis.
Juurutamise kaalutlused ja turvalisuse parimad tavad
Kuigi `BigInt` annab meile võimaluse neid täiustatud toiminguid mõista ja juurutada, on tootmiskvaliteediga krüptograafia ehitamine ohtlik ülesanne. Siin on mõned kriitilised kaalutlused.
1. ÄRGE Tehke Tootmises Ise Krüptot
Selle artikli eesmärk on harida ja illustreerida aluseks olevat mehaanikat. Te ei tohiks kunagi juurutada neid krüptograafilisi primitiive nullist tootmisrakenduse jaoks. Kasutage hästi kontrollitud, auditeeritud ja eelretsenseeritud teeke nagu `noble-curves`. Need teegid on ehitatud ekspertide poolt spetsiaalselt selleks otstarbeks ja võtavad arvesse paljusid peeneid, kuid kriitilisi turvaprobleeme.
2. Konstantse aja toimingud ja kĂĽlgkanalirĂĽnnakud
Üks ohtlikumaid lõkse on külgkanalirünnak. Ründaja saab analüüsida süsteemi mittefunktsionaalseid aspekte – näiteks energiatarbimist või toimingu täpset aega – et lekkida teavet salajaste võtmete kohta. Näiteks kui korrutamine võtmes oleva bitiga '1' võtab veidi kauem aega kui bitiga '0', saab ründaja võtme rekonstrueerida, jälgides ajastuse muutusi.
JavaScripti standardsed `BigInt` toimingud ei ole konstantse ajaga. Nende täitmisaeg võib sõltuda operandide väärtusest. Professionaalsed krüptograafilised teegid kasutavad kõrgelt spetsialiseeritud algoritme, et tagada, et kõik privaatvõtmeid hõlmavad toimingud võtavad konstantse aja, olenemata võtme väärtusest, leevendades seeläbi seda ohtu.
3. Turvaline juhuslike arvude genereerimine
Iga krüptograafilise süsteemi turvalisus algab selle juhuslikkuse kvaliteediga. Privaatvõtmed tuleb genereerida krüptograafiliselt turvalise pseudo-juhuslike arvude generaatori (CSPRNG) abil. JavaScripti keskkondades kasutage alati sisseehitatud API-sid:
- Brauser:
crypto.getRandomValues() - Node.js:
crypto.randomBytes()
Ärge kunagi kasutage krüptograafilistel eesmärkidel Math.random(), kuna see ei ole mõeldud ettearvamatuks.
4. Domeeniparameetri ja avaliku võtme valideerimine
Kui saate avaliku võtme välisest allikast, on ülioluline seda valideerida. Ründaja võib esitada pahatahtliku punkti, mis tegelikult ei asu määratud elliptilisel kõveral, mis võib viia rünnakuteni, mis paljastavad teie privaatvõtme ECDH võtmevahetuse ajal (nt kehtetud kõvera rünnakud). Mainekad teegid haldavad seda valideerimist automaatselt.
Järeldus
`BigInt` saabumine on fundamentaalselt muutnud krüptograafia maastikku JavaScripti ökosüsteemis. See on viinud ECC läbipaistmatute, musta kasti teekide valdkonnast millekski, mida saab juurutada ja mõista natiivselt, edendades uut läbipaistvuse ja võimekuse taset.
Oleme uurinud, kuidas see üks funktsioon võimaldab täiustatud ja võimsaid krüptograafilisi toiminguid, mis on kaasaegsete turvaliste süsteemide jaoks kesksed:
- ECDH võtmevahetus: Alus turvaliste sidekanalite loomiseks.
- Avaliku võtme taastamine: Tõhusust suurendav tehnika, mis on ülioluline skaleeritavate süsteemide, näiteks plokiahelate jaoks.
- Schnorri signatuurid: Järgmise põlvkonna signatuuriskeem, mis pakub suurepärast tõhusust, privaatsust ja skaleeritavust agregeerimise kaudu.
Arendajate ja arhitektidena pole nende täiustatud kontseptsioonide mõistmine enam lihtsalt akadeemiline harjutus. Neid juurutatakse täna ülemaailmsetes süsteemides, alates Bitcoini Taprooti uuendusest kuni turvaliste sõnumivahetusprotokollideni, mis kaitsevad meie igapäevaseid vestlusi. Kuigi lõplik juurutamine tuleks alati jätta auditeeritud, ekspertide poolt üle vaadatud teekidele, annab mehaanika põhjalik mõistmine, mis on võimaldatud selliste tööriistadega nagu `BigInt`, meile võimaluse ehitada turvalisemaid, tõhusamaid ja uuenduslikumaid rakendusi ülemaailmsele publikule.